import java.util.InputMismatchException;
import java.util.Scanner;

public class TestFinally {
    public static int getData(){
        Scanner sc=null;
        try{
            sc=new Scanner(System.in);
            int data=sc.nextInt();
            return data;
        }catch(InputMismatchException e){
            e.printStackTrace();
        }finally{
            System.out.println("finally中的代码");
        }
        System.out.println("try-catch-finally之后的代码");
        if(null!=sc){
            sc.close();
        }
        return 0;
    }

    public static void main(String[] args) {
        int data=getData();
        System.out.println(data);
    }
    //上述程序，如果正常输入，成功接受输入后程序就返回了，try-catch-finally之后的代码根本就没有执行。即输入流就没有被释放，造成资源泄露
    //

    //我们不建议在finally中写return，
    //因为finally是在其他的返回值之前执行的
    //如果你这个东西里面有返回，就不会去执行其他的返回了
    //这燕子写也会被当作一个警告
    //

    //异常的处理流程
    //关于调用栈
    //方法之间是存在相互调用关系的，这种调用关系我们可以用调用栈描述，在jvm中有一块内存空间被称为“虚拟机栈”专门存储方法之间的调用关系，当代码出现异常的时候
    //我们就可以通过e.printStackTrace();的方法阿里查看出现异常代码的调用栈
    //
    //如果本方法中没有何时的处理异常的方式，就会沿着调用栈向上传递
    //如果一直向上都没有何时的方法处理异常，最终就会交给jvm处理，程序就会异常终止（和我们最开始没有使用try-catch时候一样）
    //
}
